Bootloader 与 OTA 问答合集
本合集由同主题多个问答的答案精华重新组织而成,原帖均保留未动。
一、Bootloader 为什么用标准库而不用 HAL
Bootloader 是整个项目中一般不会修改的部分,要执行外部 Flash 拷贝等精细操作,对体积和效率都有要求;HAL 库存在代码冗余。Bootloader 越小,留给 APP 的空间就越大。
— 为什么写Bootloader需要使用标准库(Jack)
二、跳转 APP 前后的现场处理
- Bootloader 里跑 FreeRTOS 时,跳转 APP 前必须关闭 SysTick 定时器并关中断;进入 APP 后先做反向初始化(外设、时钟),再重新初始化外设和时钟、开中断。
- 之所以要关闭 RTC、禁用中断:防止跳转过程中产生中断,导致程序卡死。
— Bootloader跳转APP时需要注意什么(Jack)
— 老师 我问一下Bootloader的编写为何要关闭RTC和禁用中断(Jack)
三、上电启动流程与信任链
- 上电后,厂商固化在芯片里的 bootrom 根据 BOOT0/BOOT1 引脚状态选择从 RAM 还是主 Flash(0x08000000)启动;若该位置放的是 Bootloader,则先跑 Bootloader,再由它跳转到 APP。
- 信任链的根在硬件:MCU 的启动地址由 bootrom 里的代码决定,是芯片出厂时硬件写死的,无法修改,所以第一条指令永远从 0x08000000 运行,这就是信任链的起点。
— 老师,上电的时候,boot引脚选择 user flash启动(Jack)
— 老师,再请教一个问题。bootloader启动app会对app进行验签(Jack)
四、跳转后 SRAM 会被永久浪费吗
不会。Bootloader 只在启动时运行,跳转后 APP 启动文件会把 MSP 重新指向 SRAM 最高地址,相当于覆盖了 Bootloader 的栈。那段区域虽有脏数据,但会被 APP 启动流程覆写,因此不存在永久弃用的 SRAM,本质上也谈不上"释放"动作。
— 老师,在BootLoader跳转函数中会设置app的栈顶指针(Jack)
五、多板系统的升级职责划分
三块板(一主两扩、串口互联)的场景:主板升级自己的固件放在主板 Boot 里处理;主板给两块扩展板升级固件,优先放在主板 APP 里处理。主板 Boot 不建议塞太多扩展板升级逻辑——Boot 越小越稳定、越简单越可靠。
— 老师,我想请问一个场景,现在有三块板子,一块主板,两块扩展板(Jack)
六、OTA 升级通道换成 CAN 怎么入手
思路:先学 OTA,再把 OTA 的固件来源换成 CAN 即可。可参考 Ymodem 协议与 CAN 驱动的写法;话题较大,建议先打牢 OTA 基础再到交流群讨论细节。
— 这个你可以先学习OTA,然后O(BasTard)
七、Ymodem 起始帧里不固定的文件名,文件大小从哪来
加密工具在加密时会把文件大小读出来,写到起始帧固定的字节位置,解密端照着固定偏移读取即可,不依赖文件名长度。
— Q:老师 这里我有个疑惑,这里是出自OTA升级专题(Jack)